Beide Methoden funktionieren in der Tat!
Grüsse gehen raus an die Kryptocrew, Fireball, ultraschall und an
den Rest der TGC Crew
Inhalt
Einleitung
Hey was geht? Ich bin endlich wieder für euch da, mit allen möglichen Grammatischen und
Rechtschreibe Fehler (wie gewohnt) aber egal. Ich hätte schon einige Tutorials schreiben
können, aber da war nichts aussergewöhnliches.
Programm
Heute gibt es zwar keine aussergewöhnliche Methode oder ähnliches aber für das Spiel
"Tomb Raider 4" ein zu einfach zu crackender Kopierschutz.
Tools
Tutor
Nun wollen wir das Spiel cracken (so das man es ohne CD spielen kann).
* Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation"
|
:0048D88F 6844354B00 push 004B3544
:0048D894 881D84EE4B00 mov byte ptr [004BEE84], bl
:0048D89A A2AF287500 mov byte ptr [007528AF], al
:0048D89F 881DA5287500 mov byte ptr [007528A5], bl
:0048D8A5 891DBC287500 mov dword ptr [007528BC], ebx
:0048D8AB E8A00B0000 call 0048E450
:0048D8B0 83C40C add esp, 0000000C
:0048D8B3 84C0 test al, al
:0048D8B5 0F8500040000 jne 0048DCBB
:0048D8BB E8F060FEFF call 004739B0 <-- Hier ist ein Wichtiger Call
:0048D8C0 84C0 test al, al <-- Hier der letzte Vergleich vor der MsgBoxA
:0048D8C2 7525 jne 0048D8E9 <-- Hier ist der letzte Jump vor der MsgBoxA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048D8E7(C) <-- Anfang der Procedure!! (!Das soll nicht mehr kommen!)
|
:0048D8C4 6A25 push 00000025
* Possible StringData Ref from Data Obj ->"Tomb Raider"
|
:0048D8C6 6838354B00 push 004B3538
* Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation "
->"CD"
|
:0048D8CB 6810354B00 push 004B3510
:0048D8D0 53 push ebx
* Reference To: USER32.MessageBoxA, Ord:01BEh <-- Hier ist die MessageBoxA
|
:0048D8D1 FF15CC814A00 Call dword ptr [004A81CC]
:0048D8D7 83F802 cmp eax, 00000002
:0048D8DA 0F84DB030000 je 0048DCBB
:0048D8E0 E8CB60FEFF call 004739B0 <-- Hier ist nochmals der Call!
:0048D8E5 84C0 test al, al
:0048D8E7 74DB je 0048D8C4 <-- Hier springt her zum Anfang der Procedure!
Jetzt könnte man ja denken den letzten Jump zu einem JMP (direct Jump: also immer springen)
umzuschreiben, habe ich auch aber dann kommt eine Fehlermeldung und er lädt nicht das Spiel!
Also müssen wir mal nachschauen, was er vergleicht.
Vermutung: Er vergleicht den Rückgabewert aus dem Call mit einem anderen und macht dann den
Jump oder nicht. Also schauen wir mal nach wohin er da springt!
Geht im ASM Text zur Stelle 004739B0 und ihr findet folgendes...
* Referenced by a CALL at Addresses:
|:0048D8BB , :0048D8E0
|
:004739B0 83EC18 sub esp, 00000018 <-- Hier springt er hin...
:004739B3 A1AC174B00 mov eax, dword ptr [004B17AC]
:004739B8 8B0DB0174B00 mov ecx, dword ptr [004B17B0]
:004739BE 8B15B4174B00 mov edx, dword ptr [004B17B4]
:004739C4 53 push ebx
:004739C5 8944240C mov dword ptr [esp+0C], eax
:004739C9 66A1B8174B00 mov ax, word ptr [004B17B8]
:004739CF 56 push esi
:004739D0 57 push edi
:004739D1 894C2418 mov dword ptr [esp+18], ecx
:004739D5 8954241C mov dword ptr [esp+1C], edx
:004739D9 6689442420 mov word ptr [esp+20], ax
* Reference To: KERNEL32.GetLogicalDrives, Ord:0120h
|
:004739DE FF15E4804A00 Call dword ptr [004A80E4]
:004739E4 8D4C240C lea ecx, dword ptr [esp+0C]
* Possible StringData Ref from Data Obj ->"A:\"
|
:004739E8 68A8174B00 push 004B17A8
:004739ED 51 push ecx
:004739EE 8BD8 mov ebx, eax
:004739F0 C605A023530041 mov byte ptr [005323A0], 41
* Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:004739F7 FF15E8804A00 Call dword ptr [004A80E8]
:004739FD 85DB test ebx, ebx
:004739FF 7461 je 00473A62
* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h <-- Ups! Was haben wir den da?!
|
:00473A01 8B3DEC804A00 mov edi, dword ptr [004A80EC]
...
...
...
Ja genau, ein GetDriveTypeA (-> ist eine CD drin?) also prüft er nach der CD...
Wie wir hoffentlich wissen ist der positive (für uns) Rückgabewert von einem GetDriveTypeA
die 1. Und wir wissen das der Wert in eax steht! Man muss jetzt den eax Wert zu 1 bringen.
Man schreibt das schließlichv mit Hilfe von "mov eax, 1"! Aber wohin?
2 Möglichkeiten!
* Referenced by a CALL at Addresses:
|:0048D8BB , :0048D8E0
|
:004739B0 83EC18 mov eax, 00000001 <-- UNSER eax-Wert
:004739B3 A1AC174B00 ret <-- ein Return
:004739B8 8B0DB0174B00 mov ecx, dword ptr [004B17B0]
:004739BE 8B15B4174B00 mov edx, dword ptr [004B17B4]
...
...
...
:0048D8BB E8F060FEFF mov eax 00000001 <-- Hier wurde der Call geändert
:0048D8C0 84C0 test al, al <-- Hier der letzte Vergleich vor der MsgBoxA
:0048D8C2 7525 jne 0048D8E9 <-- Hier ist der letzte Jump vor der MsgBoxA
So, wie ihr es wohl gewohnt seid, schreibt ihr alle Änderungen auf und auch alle Stellen,
auch die Hexzahlen für die Stellen. Jetzt dürfte es kein Problem mehr sein die Original
"Tomb4.exe" umzuschreiben! Ihr könnt einen Hex Editor benutzen oder eine Programmiersprache
und einen crack schreiben.
Sonstige
So das war es dann! Wir sehen uns dann hoffentlich in meinem nächsten Tutor! Hoffentlich dauert
das nicht wieder so lange. Naja, falls es euch geholfen hat oder ihr noch irgendwelche Fragen
habt, dann e-mailt mir einfach (ich freue mich über jede mail)!